En la actualidad, debido a la globalización es importante para las empresas conocer a sus clientes, la tecnología, sin duda ha permitido recaudar volúmenes enormes de información, sin embargo, en muchas ocasiones precisamente la información requerida por una empresa es difícil de obtener o representa información sensible para los usuarios, ya que invade su privacidad. No obstante, con los avances en analítica se han creado herramientas para lograr obtener la información necesaria de los usuarios sin invadir su intimidad y está ha podido utilizarse para estimar valores sobre el resto de la población, aun sin tener que preguntar directamente sobre la misma.
Entre los datos que en algunos contextos pueden ser censurados u omitidos está el número de hijos en un hogar, lo que hace que sea una variable de la que no se dispone directamente; por lo tanto el problema en particular en el que se está interesado es la predicción del número de hijos en base a las características de los hogares colombianos.
Se decidió abordar este problema como un problema de clasificación (aprendizaje supervisado). Para esto se tuvo en cuenta los siguiente:
Se realizó una buena investigación y contextualización del conjunto de datos que fueron obtenidos de la ECV realizada por el DANE en 2019, mediante este se tuvo la oportunidad de establecer el número de hijos mediante la combinación de algunas variables presentes en un conjunto de datos particular abordado en la encuesta, además de seleccionar las variables más relevantes para realizar un análisis y la modelación.
Se procedió a la selección de variables, las cuales posteriormente fueron unidas mediante indicadores de hogares, este procedimiento fue realizado de manera muy cuidadosa para no obtener información incorrecta, después de este paso se llegó a una base de datos con las variables consideradas por lo investigadores como de interés.
Previo a lo anterior, se procedió a realizar un análisis descriptivo sobre el conjunto de datos, que ayudaran a una mejor comprensión de las variables y a seleccionar cuales de estas eran más relevantes para predecir el número de hijos, se realizaron gráficos y demás análisis.
Como paso siguiente se usaron técnicas estadísticas para la selección de variables mediante la formulación de modelos, los cuales en su mayoría coincidieron con los resultados las variables seleccionadas mediante el análisis descriptivo.
Luego de este proceso de selección de variables se obtuvo un conjunto de datos con menos variables pero con el mismo número de registros, y asi empezar a modelar la variable objetivo.
Para la modelación se tendra el problema como uno de clasificación, donde el número de hijos corresponde a cada nivel de la variable respuesta como categoría.
Los modelos seleccionados fueron considerados como los más adecuados para este problema en particular y son populares en el mundo del aprendizaje estadístico, se realizaron ajustes con cada uno y se realizó validación cruzada, para poder evaluar el rendimiento de cada uno de ellos (mediante tasas de acierto y error).
Después de ajustar varios modelos, se analizó la posibilidad de encontrar el mismo resultado con menos variables, encontrando que se obtenía la misma tasa de acierto, aunque, el número de variables utilizadas era menor; por lo tanto, se decidió nuevamente hacer una reducción de variables, de tal manera que se obtuvieron modelos más parsimoniosos (Buenos resultados con menos variables) llegando finalmente a modelos con cinco variables.
De los modelos ajustados inicialmente se consideraron los cuatro mejores. Posteriormente estos modelos se ponen en competencia mediante distintas muestras aleatorias, divididas en conjunto de entrenamiento y validación; de tal manera, que el mejor modelo sea aquel que obtenga mejores resultados en el conjunto de validación en las diferentes muestras.
Bosques Aleatorios resultó ser el mejor después de este procedimiento, teniendo una alta tasa de aciertos. Después, se ajustó el mismo modelo con el conjunto de datos completo, con el fin de generar mejores predicciones por el hecho de contar con un mayor número de información.
Como parte final, se aplicará el modelo obtenido en una página web que permitirá la interacción con sus posibles usuarios, esto mostrará su potencial para predecir el número de hijos de un hogar según la estructura del mismo.
El número de hijos en un hogar es una variable muy simple y poco estudiada en algunos contextos, por eso los volúmenes de datos que se encuentran en la web muchas veces no disponen de este tipo de información, pero para entidades como inmobiliarias, empresas crediticias, etc; puede serles de sumo interés, por ello, bajo trabajos de investigación se llega a la conclusión de que estas variables pueden ser deducidas a partir de otras que siguen en el mismo contexto, en este caso particular el número de hijos puede ser deducida a partir de conjuntos de datos relacionados con información acerca de los hogares del país, por lo tanto, una de las bases de datos que se considera tienen más relación con las viviendas y hogares de Colombia es la encuesta de Calidad de vida, donde la más actualizada hasta la fecha es la realizada en el año 2019.
La Encuesta de Calidad de Vida (ECV) es una investigación que realiza el DANE, con el objetivo de recoger información sobre diferentes aspectos y dimensiones del bienestar de los hogares, incluyendo aspectos como el acceso a bienes y servicios públicos, privados o comunales, salud, educación, cuidado de niños y niñas menores de 5 años, entre otros. Esta información posibilita efectuar análisis posteriores de los factores que explican los diferentes niveles de vida existentes en la población colombiana.
Por ello mediante este conjunto de datos que tiene un gran volumen se intenta extraer aquellas variables que se consideran más representativas para intentar predecir el número de hijos que tienen cada uno de los hogares; Antes de ello, se debe de definir para esta investigación que es un hogar y que es el número de hijos, para realizar todos los análisis posteriores en función de esta variable (Número de hijos en el hogar).
Usuario
Inmobiliarias, empresas crediticias, en las cuales el número de hijos es una información sensible, ya que esto puede suponerse como un impedimento ya sea a la hora de conseguir o rentar apartamento, o para conseguir préstamos; ya que se concibe que el mantenimiento de los hijos es elevado y este sube cuantos más hijos posee el prestatario, por lo que resulta más complicado para los padres de familia acceder a los mismos.
Agencias o constructoras inmobiliarias en ocasiones tienen mucha información histórica de los clientes, sobretodo de los jefes de hogar, obteniendo así información relevante de las características de un hogar. En base a estas características podemos predecir el número de hijos del mismo, lo cual pueden utilizar dichas empresas para lanzar nuevos proyectos y ofrecer atención más personalizada a los hogares. Adicionalmente, algunas empresas que facilitan el arriendo como intermediarios pueden tener políticas de arriendo como el hecho de que no se admiten hijos en los hogares, esto es común en residencias estudiantiles, entre otros.
Hogar
Según el DANE se entiende como hogar a una persona o grupo de personas que ocupan la totalidad o parte de una vivienda y que se han asocian para compartir su lugar de descanso, alimentos y demás necesidades básicas (si se trata de hogar-unidad doméstica) . Pueden ser familiares o no entre sí.
Un hogar no puede dividirse en más de una vivienda, pero dentro de cada vivienda, puede haber más de un hogar, conformado por una o más personas con o sin vínculos de parentesco.
Número de hijos
Se define el número de hijos de acuerdo con los hogares colombianos promedio, definidos por el DANE, en los cuales se tienen:
Se muestra a continuación una imagen que ejemplifica mejor lo antes mencionado:
En base a esto se considera como el número de hijos, a los hijos, hijastros y nietos del jefe del hogar, sin discriminar por edad, ya que está es la forma que en general funciona mejor, en base a la mayoría de estructuras de los hogares en Colombia.
En casos generales funciona esta estructura ya que en la mayoría de hogares cuenta con padres y si estos no están presentes, los abuelos de los hijos lo están, cuando se considera que hay varios grupos familiares en una misma vivienda, como lo son por ejemplo, varios hermanos con sus respectivos hijos, estos se dividirán en diferentes hogares; ya que son varios núcleos familiares en una misma vivienda, los cuales deben ser tomados como hogares de manera independiente, por lo tanto, estructuras como estas no sesgan la elección de la variable número de hijos, además que, cabe aclarar que la encuesta de calidad de vida hace esta misma división, ya que en una misma vivienda se ven presentes varios hogares(siendo 5 el máximo), por lo tanto, esta variable fue seleccionada con los hijos/hijastros y nietos del jefe del hogar; en base a la estructura de la encuesta de calidad de vida y en la perspectiva de los investigadores.
Compuesta por 46 variables de las cuales se escogieron
| Código | Nombre | Pregunta |
|---|---|---|
| P6040 | Genero |
Sexo: 1 Hombre 2 Mujer |
| P6040 | Edad | ¿Cuántos años cumplidos tiene … ? |
| P6051 | - |
¿Cuál es el parentesco de ___ con el jefe o la jefa de este hogar? 1 Jefe (a) del hogar 2 Pareja, esposo (a), cónyuge, compañero(a) 3 Hijo(a) hijastro(a) 4 Nieto (a) 5 Padre, madre, padrastro y madrastra 6 Suegro o suegra 7 Hermano (a), hermanastro (a) 8 Yerno, nuera 9 Otro pariente del jefe(a) 10 Empleado(a) del servicio doméstico 11 Parientes del servicio doméstico 12 Trabajador 13 Pensionista 14 Otro pariente |
| P5502 | Estado_civil | Actualmente el jefe del hogar: 1 No está casado(a) y vive en pareja hace menos de dos años 2 No está casado(a) y vive en pareja hace dos años o más 3 Está viudo(a) 4 Está separado(a) o divorciado(a) 5 Está soltero(a) 6 Está casado(a) |
| P756 | Lugar_nacimiento |
¿Dónde nació el jefe del hogar? 1 En este municipio 2 En otro municipio 3 En otro país |
| P6081 | Vive_hogar_padre | ¿El padre del jefe del hogar vive en este hogar? |
| P6087 | Educacion_padre | ¿Cuál es o fue el nivel de educación más alto alcanzado por el padre del jefe del hogar? |
| P6083 | Vive_hogar_madre | ¿La madre del jefe del hogar vive en este hogar? |
| P6088 | Educacion_madre | ¿Cuál es o fue el nivel de educación más alto alcanzado por la madre del jefe del hogar? |
| P6080 | Etnia | De acuerdo con su cultura, pueblo o rasgos físicos, _____ es o se reconoce como: 1 Indígena 2 Gitano (a) (Rom) 3 Raizal del archipiélago de San Andrés, Providencia y Santa Catalina 4 Palenquero (a) de San Basilio 5 Negro (a), mulato (a) (afrodescendiente), afrocolombiano(a) 6 Ninguno de los anteriores |
Compuesta por 8 variables de las cuales se escogió:
| Código | Nombre | Pregunta |
|---|---|---|
| P784S4A3 | Num_subsidios | ¿Cuántos miembros del hogar reciben subsidios? |
Compuesta por 35 variables de las cuales se escogieron:
| Código | Nombre | Pregunta |
|---|---|---|
| P1070 | Tipo_vivienda | Tipo de vivienda: 1 Casa 2 Apartamento 3 Cuarto(s) 4 Vivienda tradicional indigena 5 Otro (carpa, contenedor, vagón, embarcación, cueva, refugio natural, etc |
| P4015 | Material_pisos | Material predominante de los pisos: 1 Alfombra o tapete de pared a pared 2 Madera pulida y lacada, parqué 3 Mármol 4 Baldosa, vinilo, tableta, ladrillo, laminado 5 Madera burda, tabla, tablón, otro vegetal 6 Cemento, gravilla 7 Tierra, arena |
| P8520S1 | Energia_electrica | ¿La vivienda cuenta con energía eléctrica? 1 Sí 2 No |
| P8520S1A1 | Estrato | Estrato para tarifa de la energía eléctrica: 1 Bajo - Bajo 2 Bajo 3 Medio - Bajo 4 Medio 5 Medio - Alto 6 Alto 8 Planta eléctrica 9 No conoce el estrato o no cuenta con recibo de pago. 0 Recibos sin estrato o el servicio es pirata |
| P8520S5 | Acueducto | ¿La vivienda cuenta con acueducto? 1 Sí 2 No |
| P8520S3 | Alcantarillado | ¿La vivienda cuenta con alcantarillado? 1 Sí 2 No |
| P8520S4 | Basuras_semana | ¿Cuenta con servicio de Recolección de basuras? 1 Sí 2 No |
Compuesta por 58 variables de las cuales se escogieron:
| Código | Nombre | Pregunta |
|---|---|---|
| P8586 | Estudia | ¿El jefe del hogar actualmente estudia? (asiste al preescolar, escuela, colegio o universidad) 1 Sí 2 No |
| P8587 | Nivel_educativo | ¿Cuál es el nivel educativo más alto alcanzado por el jefe del hogar y el último año o grado aprobado en este nivel? 1 Ninguno 2 Preescolar 3 Básica Primaria (1º - 5º) 4 Básica secundaria (6º–9º) 5 Media (10º–13º) 6 Técnico sin título 7 Técnico con título 8 Tecnológico sin título 9 Tecnológico con título 10 Universitario sin titulo 11 Universitario con titulo 12 Postgrado sin titulo 13 Postgrado con titulo |
Compuesta por 103 variables de las cuales se escogieron:
| Código | Nombre | Pregunta |
|---|---|---|
| P6090 | Afiliado | ¿El jefe del hogar está afiliado (a), es cotizante o es beneficiario (a) de alguna entidad de seguridad social en salud? (Entidad promotora de salud [EPS] o entidad promotora de salud subsidiada EPS-S) 1 Sí 2 No 9 No sabe, no informa |
| P6127 | Salud_general | El estado de salud del jefe del hogar en general, es: 1 Muy bueno 2 Bueno 3 Regular 4 Malo |
Compuesta por 64 variables de las cuales se escogieron:
| Código | Nombre | Pregunta |
|---|---|---|
| P5666 | Gas_natural | ¿En este hogar tienen servicio de Gas Natural conectado a red pública? 1 Sí 2 No |
| P5305 | Telefonia_fija | ¿En este hogar tienen servicio telefónico fijo? 1 Sí 2 No |
| I_HOGAR | Ingresos_hogar | Ingreso Mensual Total del Hogar |
Compuesta por 20 variables de las cuales se escogieron:
| Código | Nombre | Pregunta |
|---|---|---|
| P5095 | Contrato_vivienda | ¿La vivienda ocupada por este hogar es? 1. Propia, totalmente pagada 2. Propia, la están pagando 3. En arriendo o subarriendo 4. Con permiso del propietario, sin pago alguno (usufructuario) 5. Posesión sin título (ocupante de hecho) 6. Propiedad colectiva |
Compuesta por 45 variables de las cuales se escogieron:
| Código | Nombre | Pregunta |
|---|---|---|
| P5018 | Ultimo_pago_energia | ¿Cuánto pagaron EL MES PASADO o la última vez por la electricidad consumida? |
| P5018S1 | - | ¿A cuántos meses corresponde el pago de la última vez por la electricidad consumida? |
| Código | Nombre | Variables utilizadas |
|---|---|---|
| P5018S | Pago_mes_energia | Esta variable fue creada dividiendo P5018/P5018S1 con el fin de obtener el pago mensual de electricidad |
| Num_integrantes | Num_integrantes | Esta variable fue creada sumando 1 unidad cada vez que el número de ORDEN cambiaba |
| Num_hijos | Num_hijos | Esta variable fue creada sumando 1 cada vez que la pregunta código P6051 toma el valor de 3 o 4 correspondiente a hijo o nieto |
Debido a que la variable de interés (Número de hijos) no aparece de manera explícita, se llevó a cabo un proceso de construcción de la misma. Esto fue posible gracias a algunas de las variables de la base de datos Características y composición del hogar, presente en la ECV(2019) que permiten conocer la relación de cada individuo con el jefe del hogar.
Como primer paso se realiza la lectura de las bases de datos:
Caracteristicas_hogar_personas <- read.table("Caracteristicas y composicion del hogar.csv", sep = ";", header = T)
Debido a que la variable P6051 muestra el parentesco de los integrantes de la familia con el jefe de hogar solo será utilizada para la creación de la variable número de hijos, es decir, no se tiene en cuenta como covariable para el ajuste de modelos:
#Selección de las variables necesarias
aux_creacion_respuesta<-Caracteristicas_hogar_personas[,c("ï..DIRECTORIO","SECUENCIA_P","P6051")]
Para obtener el número de hijos por hogar se filtran las filas, si tienen una relacion de hijo/hija o nieto/nieta con el jefe de hogar y se cuenta el número de hijos por hogar. Los hogares se describen con el código único de ï..DIRECTORIO, SECUENCIA_P
require(tidyverse)
require(dplyr)
# P6051 = 3 : Hijo/hija/hijastro
# P6051 = 4 : Nieto/nieta
num_hijos <- aux_creacion_respuesta %>%
filter(P6051 == 3 | P6051 == 4)%>%
group_by(ï..DIRECTORIO, SECUENCIA_P)%>%
count(SECUENCIA_P)
| ï..DIRECTORIO | SECUENCIA_P | n |
|---|---|---|
| 7120001 | 1 | 1 |
| 7120002 | 1 | 7 |
| 7120009 | 1 | 1 |
| 7120010 | 1 | 3 |
| 7120016 | 1 | 2 |
| 7120018 | 1 | 2 |
El número de hogares que tiene al menos un hijo es de: 59575 hogares.
A continuación, se procede a calcular el número de integrantes que pertenecen a cada hogar:
require(dplyr)
num_integrantes <- Caracteristicas_hogar_personas %>%
group_by(ï..DIRECTORIO, SECUENCIA_P) %>%
count(SECUENCIA_P)
| ï..DIRECTORIO | SECUENCIA_P | n |
|---|---|---|
| 7120001 | 1 | 4 |
| 7120002 | 1 | 10 |
| 7120005 | 1 | 2 |
| 7120006 | 1 | 3 |
| 7120007 | 1 | 3 |
| 7120008 | 1 | 1 |
El número de hogares es 93993.
Finalmente, con la función merge se obtiene el número de hijos en cada hogar, uniendo las bases de datos num_integrantes y num_hijos como sigue:
num_hijos_final <- merge(num_integrantes, num_hijos, by =c("ï..DIRECTORIO","SECUENCIA_P"), all.x=TRUE)
num_hijos_final$n.y[is.na(num_hijos_final$n.y)] <- 0 # Los datos faltantes indican que el hogar no tiene hijos
colnames(num_hijos_final) <- c("ï..DIRECTORIO","SECUENCIA_P", "Num Integrantes", "Num Hijos")
| ï..DIRECTORIO | SECUENCIA_P | Num Integrantes | Num Hijos |
|---|---|---|---|
| 7120001 | 1 | 4 | 1 |
| 7120002 | 1 | 10 | 7 |
| 7120005 | 1 | 2 | 0 |
| 7120006 | 1 | 3 | 0 |
| 7120007 | 1 | 3 | 0 |
| 7120008 | 1 | 1 | 0 |
| 7120009 | 1 | 2 | 1 |
| 7120010 | 1 | 5 | 3 |
| 7120013 | 1 | 4 | 0 |
| 7120016 | 1 | 3 | 2 |
Como paso siguiente se realizó de manera exhaustiva en cada una de las bases de la ECV, una preselección de covariables que a criterio de los investigadores, podrían tener alguna relación con la variable respuesta. Con la información anterior se procede a construir la base de datos para el paso siguiente.
A continuación se muestra la base que se obtuvo con las variables preseleccionadas que aparecen listadas en la contextualización de los datos:
# Características del hogar
Caracteristicas_hogar_personas <- read.table("Caracteristicas y composicion del hogar.csv", sep = ";", header = T)
Caracteristicas_hogar_personas<-Caracteristicas_hogar_personas[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P6020", "P6040","P6051", "P5502", "P756","P6081", "P6087","P6083","P6088","P6080")]
# Condiciones de vida del hogar y tenencia de bienes (programas)
condiciones_de_vida <- read.table("Condiciones de vida del hogar y tenencia de bienes (programas).csv", sep=";", header = T)
condiciones_de_vida <- condiciones_de_vida[, c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN","P784S4A3")]
# Datos de la vivienda
Datos_vivienda <- read.table("Datos de la vivienda.csv", sep = ";", header = T)
Datos_vivienda<-Datos_vivienda[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","CANT_HOGARES_VIVIENDA","P1070","P4015","P8520S1","P8520S1A1","P8520S5","P8520S3", "P8520S4A1")]
# Educación
Educacion<- read.table("Educacion.csv", sep = ";", header = T)
Educacion<-Educacion[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P8587","P8586")]
# Fuerza de trabajo
fuerza_trabajo <- read.table("Fuerza de trabajo.csv", sep=";", header = T)
fuerza_trabajo <- fuerza_trabajo[, c("ï..DIRECTORIO","SECUENCIA_P","ORDEN", "P6435")]
# Salud
Salud<- read.table("Salud.csv", sep = ";", header = T)
Salud<-Salud[,c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P6090","P6127")]
# Servicios del hogar
ServiciosDelHogar<- read.table("Servicios del hogar.csv", sep = ";", dec=",", header = T)
ServiciosDelHogar<-ServiciosDelHogar[,c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN","P5000","P5666","P5305", "I_HOGAR")]
# Tecnología e información y comunicación
tecn_inf_comunicacion <- read.table("Tecnologías de información y comunicación.csv", sep=";", header = T)
tecn_inf_comunicacion <- tecn_inf_comunicacion[, c("ï..DIRECTORIO","SECUENCIA_P","ORDEN","P769")]
# Tenencia y financiación de la vivienda que ocupa el hogar
financiacion_vivienda <- read.table("Tenencia y financiación de la vivienda que ocupa el hogar.csv", sep=";", header = T)
financiacion_vivienda <- financiacion_vivienda[,c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN","P5095")]
# Uso de energéticos del hogar
energeticos_hogar <- read.table("Uso de energéticos del hogar.csv", sep=";", header = T)
energeticos_hogar <- energeticos_hogar[,c("ï..DIRECTORIO","SECUENCIA_ENCUESTA","ORDEN", "P5018", "P5018S1")]
Se creó una única base de datos con la variable de interés (Número de hijos) y las demás variables seleccionadas. Dado que las posibles variables explicativas provenían de diferentes tablas, se procedió a realizar un merge entre ellas, usando como variable de referencia la columna “Directorio” y “Secuencia” que son las dos variables que identifican a un hogar, y teniendo especial cuidado en la unión de tablas donde las preguntas pueden ser por vivienda, hogar o integrantes y se debía llevar a una misma estructura de hogares.
# Merge de la base de datos de caracteristicas del hogar con condiciones de vida
Base1 <- merge(Caracteristicas_hogar_personas, condiciones_de_vida, by.x = c("ï..DIRECTORIO","SECUENCIA_P"), by.y = c("ï..DIRECTORIO","SECUENCIA_ENCUESTA"), all.x =TRUE)
# Merge de Base1 con datos vivienda
Base2 <- merge(Base1, Datos_vivienda, by="ï..DIRECTORIO", all.x=T)
# Merge de Base2 con educación
Base3 <- merge(Base2, Educacion, by =c("ï..DIRECTORIO","SECUENCIA_P", "ORDEN"), all.x=TRUE)
# Merge de todas las bases de datos restantes
## Bases de personas
Base4 <- Reduce(function(...) merge (..., by=c("ï..DIRECTORIO","SECUENCIA_P", "ORDEN"), all=T), list(Base3, fuerza_trabajo, Salud, tecn_inf_comunicacion))
Base4[,c("ORDEN")] <- NULL
## Bases de hogares
Base5 <- Reduce(function(...) merge (..., by= c("ï..DIRECTORIO","SECUENCIA_ENCUESTA", "ORDEN"), all=T), list(ServiciosDelHogar, financiacion_vivienda, energeticos_hogar))
Base5[,c("ORDEN")] <- NULL
Una vez obtenida la base 4 agrupada por i..DIRECTORIO y SECUENCIA_P y la base 5 agrupada por i..DIRECTORIO y SECUENCIA_ENCUESTA se procede a agruparlas igualando SECUENCIA_P con SECUENCIA_ENCUESTA.
Base6 <- merge(Base4, Base5, by.x =c("ï..DIRECTORIO","SECUENCIA_P"),
by.y =c("ï..DIRECTORIO","SECUENCIA_ENCUESTA"), all=TRUE)
Finalmente, se agrupa la base anterior con la base que contiene el número de hijos, obteniendo:
# Base final
Base_final <- merge(Base6, num_hijos_final, by =c("ï..DIRECTORIO","SECUENCIA_P"), all.x=TRUE)
Base_final[,c("P6435","P6051","P5018S1","ï..DIRECTORIO","SECUENCIA_P")] <- NULL
| P6020 | P6040 | P5502 | P756 | P6081 | P6087 | P6083 | P6088 | P6080 | P784S4A3 | CANT_HOGARES_VIVIENDA | P1070 | P4015 | P8520S1 | P8520S1A1 | P8520S5 | P8520S3 | P8520S4A1 | P8587 | P8586 | P6090 | P6127 | P769 | P5000 | P5666 | P5305 | I_HOGAR | P5095 | P5018 | P5018S | Num Integrantes | Num Hijos |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 44 | 2 | 1 | 2 | 10 | 3 | 1 | 6 | 0 | 1 | 2 | 4 | 1 | 3 | 1 | 1 | 3 | 7 | 2 | 1 | 3 | 1 | 3 | 1 | 2 | 3800000.0 | 3 | 85000 | 85000 | 4 | 1 |
| 1 | 61 | 6 | 1 | 3 | 2 | 3 | 2 | 5 | 0 | 1 | 1 | 4 | 1 | 2 | 1 | 1 | 3 | 5 | 2 | 1 | 2 | 1 | 5 | 1 | 1 | 3656652.8 | 4 | 62000 | 62000 | 10 | 7 |
| 1 | 79 | 6 | 2 | 3 | 10 | 3 | 10 | 6 | 0 | 1 | 1 | 4 | 1 | 3 | 1 | 1 | 3 | 11 | 2 | 1 | 4 | 2 | 5 | 1 | 1 | 4200000.0 | 1 | 189000 | 189000 | 2 | 0 |
| 2 | 37 | 5 | 2 | 3 | 2 | 2 | 3 | 6 | 0 | 1 | 2 | 4 | 1 | 3 | 1 | 1 | 3 | 9 | 2 | 1 | 2 | 2 | 3 | 1 | 2 | 1365000.0 | 3 | 188800 | 188800 | 3 | 0 |
| 1 | 72 | 5 | 1 | 3 | 3 | 3 | 2 | 5 | 0 | 1 | 2 | 4 | 1 | 2 | 1 | 1 | 3 | 4 | 2 | 1 | 3 | NA | 4 | 1 | 2 | 765833.3 | 1 | 87000 | 87000 | 3 | 0 |
| 1 | 73 | 5 | 2 | 3 | 9 | 3 | 9 | 6 | 0 | 1 | 2 | 6 | 1 | 2 | 1 | 1 | 3 | 3 | 2 | 1 | 2 | 1 | 3 | 2 | 2 | 1785721.9 | 3 | 30000 | 30000 | 1 | 0 |
Se realizó un análisis descriptivo a cada variable donde se identificó el rango y media de las variables continuas y discretas respectivamente, y la proporción de cada clase en las variables categóricas, además de la identificación de las variables con valores faltantes.
require(knitr)
kable(summary(Base_final))%>%
kable_styling("striped")%>%
scroll_box(width = "100%", height = "300px")
| P6020 | P6040 | P5502 | P756 | P6081 | P6087 | P6083 | P6088 | P6080 | P784S4A3 | CANT_HOGARES_VIVIENDA | P1070 | P4015 | P8520S1 | P8520S1A1 | P8520S5 | P8520S3 | P8520S4A1 | P8587 | P8586 | P6090 | P6127 | P769 | P5000 | P5666 | P5305 | I_HOGAR | P5095 | P5018 | P5018S | Num Integrantes | Num Hijos | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. :1.000 | Min. : 13.00 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. : 1.000 | Min. :1.000 | Min. : 1.000 | Min. :1.000 | Min. :0.00000 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. :0.000 | Min. :1.000 | Min. :1.0 | Min. :1.00 | Min. : 1.00 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. :1.000 | Min. : 1.000 | Min. :1.000 | Min. :1.000 | Min. : 0 | Min. :1.00 | Min. : 0 | Min. : 333.3 | Min. : 1.000 | Min. : 0.000 | |
| 1st Qu.:1.000 | 1st Qu.: 36.00 | 1st Qu.:2.000 | 1st Qu.:1.000 | 1st Qu.:2.000 | 1st Qu.: 1.000 | 1st Qu.:2.000 | 1st Qu.: 1.000 | 1st Qu.:6.000 | 1st Qu.:0.00000 | 1st Qu.:1.000 | 1st Qu.:1.000 | 1st Qu.:4.000 | 1st Qu.:1.000 | 1st Qu.:1.000 | 1st Qu.:1.000 | 1st Qu.:1.0 | 1st Qu.:2.00 | 1st Qu.: 3.00 | 1st Qu.:2.000 | 1st Qu.:1.000 | 1st Qu.:2.000 | 1st Qu.:1.000 | 1st Qu.: 2.000 | 1st Qu.:1.000 | 1st Qu.:2.000 | 1st Qu.: 530000 | 1st Qu.:1.00 | 1st Qu.: 15000 | 1st Qu.: 20000.0 | 1st Qu.: 2.000 | 1st Qu.: 0.000 | |
| Median :1.000 | Median : 48.00 | Median :4.000 | Median :1.000 | Median :3.000 | Median : 4.000 | Median :2.000 | Median : 3.000 | Median :6.000 | Median :0.00000 | Median :1.000 | Median :1.000 | Median :6.000 | Median :1.000 | Median :1.000 | Median :1.000 | Median :1.0 | Median :3.00 | Median : 4.00 | Median :2.000 | Median :1.000 | Median :2.000 | Median :1.000 | Median : 3.000 | Median :2.000 | Median :2.000 | Median : 1020000 | Median :3.00 | Median : 30000 | Median : 35000.0 | Median : 3.000 | Median : 1.000 | |
| Mean :1.363 | Mean : 48.86 | Mean :3.716 | Mean :1.468 | Mean :2.495 | Mean : 5.284 | Mean :2.362 | Mean : 4.921 | Mean :5.418 | Mean :0.01813 | Mean :1.022 | Mean :1.308 | Mean :5.166 | Mean :1.055 | Mean :1.901 | Mean :1.287 | Mean :1.5 | Mean :2.47 | Mean : 4.44 | Mean :1.975 | Mean :1.079 | Mean :2.186 | Mean :1.257 | Mean : 3.084 | Mean :1.608 | Mean :1.903 | Mean : 1727919 | Mean :2.48 | Mean : 46910 | Mean : 51487.1 | Mean : 3.081 | Mean : 1.302 | |
| 3rd Qu.:2.000 | 3rd Qu.: 61.00 | 3rd Qu.:5.000 | 3rd Qu.:2.000 | 3rd Qu.:3.000 | 3rd Qu.: 9.000 | 3rd Qu.:3.000 | 3rd Qu.: 9.000 | 3rd Qu.:6.000 | 3rd Qu.:0.00000 | 3rd Qu.:1.000 | 3rd Qu.:1.000 | 3rd Qu.:6.000 | 3rd Qu.:1.000 | 3rd Qu.:2.000 | 3rd Qu.:2.000 | 3rd Qu.:2.0 | 3rd Qu.:3.00 | 3rd Qu.: 5.00 | 3rd Qu.:2.000 | 3rd Qu.:1.000 | 3rd Qu.:2.000 | 3rd Qu.:1.000 | 3rd Qu.: 4.000 | 3rd Qu.:2.000 | 3rd Qu.:2.000 | 3rd Qu.: 1873116 | 3rd Qu.:4.00 | 3rd Qu.: 57000 | 3rd Qu.: 60000.0 | 3rd Qu.: 4.000 | 3rd Qu.: 2.000 | |
| Max. :2.000 | Max. :106.00 | Max. :6.000 | Max. :3.000 | Max. :3.000 | Max. :10.000 | Max. :3.000 | Max. :10.000 | Max. :6.000 | Max. :9.00000 | Max. :5.000 | Max. :5.000 | Max. :7.000 | Max. :2.000 | Max. :9.000 | Max. :2.000 | Max. :2.0 | Max. :9.00 | Max. :13.00 | Max. :2.000 | Max. :9.000 | Max. :4.000 | Max. :4.000 | Max. :16.000 | Max. :2.000 | Max. :2.000 | Max. :284600000 | Max. :6.00 | Max. :1000000 | Max. :1000000.0 | Max. :19.000 | Max. :14.000 | |
| NA | NA | NA | NA | NA | NA’s :674 | NA | NA’s :2181 | NA | NA | NA | NA | NA | NA | NA’s :5194 | NA | NA | NA’s :34262 | NA’s :2366 | NA | NA | NA | NA’s :9197 | NA | NA | NA | NA | NA | NA’s :5194 | NA’s :17719 | NA | NA |
Se decidió remover de la base de datos a aquellas variables cuyos valores faltantes superar un tercio de la cantidad de registros en la base de datos.
Con el fin de depurar la base de datos, mediante gráficos se realizó un análisis descriptivo de las variables.
Para finalizar la etapa de preprocesamiento, se crearon gráficos Boxplots del Número de hijos vs las variables categóricas, respectivamente, con el fin de analizar la posible influencia o relación de cada predictora con la respuesta.
sapply(1:32, function(i){
boxplot(Base_final$Num_hijos~Base_final[, i], xlab = nombres[i])
})
require(gridExtra)
grid.arrange(gra1, gra2, gra3, gra4, nrow = 2,ncol = 2)
grid.arrange(gra5, gra6, gra7, gra8, nrow = 2,ncol = 2)
grid.arrange(gra9, gra10, gra11, gra12, nrow = 2,ncol = 2)
grid.arrange(gra13, gra14, gra15, gra16, nrow = 2,ncol = 2)
grid.arrange(gra17, gra18, gra19, gra20, nrow = 2,ncol = 2)
grid.arrange(gra21, gra22, gra23, gra24, nrow = 2,ncol = 2)
grid.arrange(gra25, gra26, nrow = 1, ncol = 2)
grid.arrange(gra27, nrow = 1,ncol = 1)
Y para las variables numéricas se utilizan gráficos de puntos vs Num_hijos para analizar la posible influencia o relación de cada predictora con la respuesta.
par(mfrow=c(2,2))
plot(Base_final$Num_hijos~ Base_final$Edad)
plot(Base_final$Num_hijos~ Base_final$Ingresos_hogar)
plot(Base_final$Num_hijos~ Base_final$Ultimo_pago_energia)
plot(Base_final$Num_hijos~ Base_final$Pago_mes_energia)
var_interesantes <- c(
"Genero",
"Edad",
"Num_integrantes",
"Num_cuartos",
"Estrato",
"Tipo_vivienda",
"Num_Subsidios",
"Educacion_madre",
"Estado_civil",
"Ultimo_pago_energia",
"Ingresos_hogar",
"Cant_hogares_vivienda",
"Num_hijos"
)
Se realiza un subset con las variables interesantes
| Genero | Edad | Num_integrantes | Num_cuartos | Estrato | Tipo_vivienda | Num_Subsidios | Educacion_madre | Estado_civil | Ultimo_pago_energia | Ingresos_hogar | Cant_hogares_vivienda | Num_hijos |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 44 | 4 | 3 | 3 | 2 | 0 | 1 | 2 | 85000 | 3800000.0 | 1 | 1 |
| 1 | 61 | 10 | 5 | 2 | 1 | 0 | 2 | 6 | 62000 | 3656652.8 | 1 | 7 |
| 1 | 79 | 2 | 5 | 3 | 1 | 0 | 10 | 6 | 189000 | 4200000.0 | 1 | 0 |
| 2 | 37 | 3 | 3 | 3 | 2 | 0 | 3 | 5 | 188800 | 1365000.0 | 1 | 0 |
| 1 | 72 | 3 | 4 | 2 | 2 | 0 | 2 | 5 | 87000 | 765833.3 | 1 | 0 |
| 1 | 73 | 1 | 3 | 2 | 2 | 0 | 9 | 5 | 30000 | 1785721.9 | 1 | 0 |
Las variables categóricas de Base_interesante se convierten a factor y se crea un modelo de regresión lineal múltiple para poder utilizar regresión paso a paso
mod1 <- lm(Num_hijos~., data = Base_interesante)
Para la preseleccion de variables también se utilizaron métodos de selección de variables tales como Regresión paso a paso y Lasso.
require(olsrr)
ols_step_both_p(mod1)
##
## Stepwise Selection Summary
## ------------------------------------------------------------------------------------------------------
## Added/ Adj.
## Step Variable Removed R-Square R-Square C(p) AIC RMSE
## ------------------------------------------------------------------------------------------------------
## 1 Num_integrantes addition 0.836 0.836 14121.0890 147987.0388 0.5567
## 2 Num_cuartos addition 0.838 0.838 12584.9020 146651.7229 0.5525
## 3 Estrato addition 0.838 0.838 12431.6950 146517.6593 0.5521
## 4 Tipo_vivienda addition 0.839 0.839 12302.1070 146404.1379 0.5517
## 5 Estado_civil addition 0.839 0.839 12229.5050 146340.5776 0.5515
## 6 Genero addition 0.859 0.859 2.3500 131676.5283 0.5171
## 7 Ultimo_pago_energia addition 0.859 0.859 -10.3360 131663.8376 0.5170
## ------------------------------------------------------------------------------------------------------
Se toma la Base_final que posee 32 variables y se convierten las variables categóricas a factor. Se eliminan las variables con mayor número de NA y se eliminan las filas con NA.
Se crea una matriz de diseño para aplicar Regresión Lasso
x <- model.matrix(Num_hijos ~ ., Base_menos_Nas)[,-1]
y <- Base_menos_Nas$Num_hijos
# Aplicación de la técnica de regularización
require(glmnet)
gridz <- 10^seq(-2,10, length = 100)
lasso.mod <- glmnet(x, y, alpha = 1, lambda = gridz)
Se hace validación cruzada para seleccionar el \(\lambda\) óptimo para aplicar en el modelo
set.seed(23)
# Indices para las filas del conjunto de entrenamiento
train <- sample(1:nrow(x), nrow(x)/2)
# Indices para las filas del conjunto de test
test <- -train
y.test <- y[test]
# Validación cruzada
cv.out <- cv.glmnet(x[train,], y[train], alpha=1)
# Obtención del mejor lambda
bestlam <-cv.out$lambda.min
# Lasso con el lambda óptimo
out <- glmnet(x, y, alpha=1)
lasso.coef <-predict(out, type = "coefficients", s=bestlam)[1:90, ]
A continuación se muestra las variables seleccionadas por medio de los dos métodos anteriores:
| Variables | Regresion por pasos | Lasso |
|---|---|---|
| Genero | X | X |
| Edad | ||
| Estado_civil | X | X |
| Lugar_nacimiento | X | |
| Vive_hogar_padre | ||
| Educacion_padre | ||
| Vive_hogar_madre | X | |
| Educacion_madre | ||
| Etnia | X | |
| Num_subsidios | X | |
| Cant_hogares_vivienda | ||
| Tipo_vivienda | X | X |
| Material_pisos | X | |
| Energia_electrica | ||
| Estrato | X | |
| Acueducto | ||
| Alcantarillado | ||
| Nivel_educativo | X | |
| Estudia | ||
| Afiliado | X | |
| Salud_general | ||
| Uso_celular | X | |
| Num_cuartos | X | X |
| Gas_natural | ||
| Telefonia_fija | ||
| Ingresos_hogar | ||
| Contrato_vivienda | X | |
| Ultimo_pago_energia | X | |
| Num_integrantes | X |
Con los anteriores procesos, se obtiene la siguiente base, que se usará en la parte de modelamiento
| Genero | Edad | Num_integrantes | Num_cuartos | Estrato | Tipo_vivienda | Num_Subsidios | Educacion_madre | Estado_civil | Ultimo_pago_energia | Ingresos_hogar | Cant_hogares_vivienda | Num_hijos | Uso_celular | Vive_hogar_madre | Contrato_vivienda | Etnia | Afiliado | Lugar_nacimiento | Nivel_educativo |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 44 | 4 | 3 | 3 | 2 | 0 | 1 | 2 | 85000 | 3800000.0 | 1 | 1 | 1 | 3 | 3 | 6 | 1 | 1 | 7 |
| 1 | 61 | 10 | 5 | 2 | 1 | 0 | 2 | 6 | 62000 | 3656652.8 | 1 | 7 | 1 | 3 | 4 | 5 | 1 | 1 | 5 |
| 1 | 79 | 2 | 5 | 3 | 1 | 0 | 10 | 6 | 189000 | 4200000.0 | 1 | 0 | 2 | 3 | 1 | 6 | 1 | 2 | 11 |
| 2 | 37 | 3 | 3 | 3 | 2 | 0 | 3 | 5 | 188800 | 1365000.0 | 1 | 0 | 2 | 2 | 3 | 6 | 1 | 2 | 9 |
| 1 | 72 | 3 | 4 | 2 | 2 | 0 | 2 | 5 | 87000 | 765833.3 | 1 | 0 | NA | 3 | 1 | 5 | 1 | 1 | 4 |
| 1 | 73 | 1 | 3 | 2 | 2 | 0 | 9 | 5 | 30000 | 1785721.9 | 1 | 0 | 1 | 3 | 3 | 6 | 1 | 2 | 3 |
Los modelos escogidos son de regresión y clasificación, en cada uno se adaptó la variable respuesta, en los de clasificación se obtienen las predicciones como el número de hijos puntual, en las de regresión se obtienen aproximaciones decimales las cual previamente debían de ser redondeadas para ser comparadas con los valores reales, en general por este último procedimiento se podía notar que en general funcionaba mucho mejor los modelos de clasificación (su tasa de aciertos era la más alta) por lo tanto finalmente estos fueron considerados como los favoritos y continuaron en el proceso de selección de modelos, además cabe aclarar que cada modelo le fue ingresado las variables como se debía según su proceso de ajuste, por ejemplo en el modelo de Knn las variables explicativas fueron ingresadas estandarizadas las que son numéricas y se crearon variables dummy para las categóricas, en general el desempeño de este modelo fue muy bueno, pero su tiempo de ejecución fue superior a otros modelos y este fue uno de los criterios utilizados en la selección de modelos.
Para la selección de modelos a ajustar se tuvo en cuenta que dado que la mayoría de las variables escogidas como significativas corresponden a variables categóricas se debieron escoger modelos que permitieran el correcto manejo de las mismas.
A continuación se utilizarán diferentes modelos para después escoger aquel que mejor se ajuste a las necesidades. Se crea un nuevo dataframe con Num_hijos organizada
barplot(prop.table(table(Base_modelar$Num_hijos)),
main = "Proporción del número de hijos",
xlab = "Número de hijos",
col = "cyan4")
grid()
Se observa que la mayoría de familias tienen entre 0 y 2 hijos, sin embargo, hay una proporción considerable de hogares que poseen 3, 4 y 5 hijos. A partir de los 6 hijos la proporción decae, por lo que se podría pensar en agrupar a los hogares en 5 categorías comprendidas como: 0, 1, 2, 3, 4, 5+.
Base_de_ensayo <- Base_modelar
# Se agrupa los hogares con 5 hijos o más en una sola categoría
Base_de_ensayo$Num_hijos[Base_de_ensayo$Num_hijos >= 5] <- 5
| Número de hijos | Frecuencia |
|---|---|
| 0 | 34418 |
| 1 | 23838 |
| 2 | 19896 |
| 3 | 9370 |
| 4 | 3770 |
| 5 | 2701 |
Se organiza la base de datos para aplicar el modelo
library(tidyverse)
# Se omiten las filas que poseen NA
Base_modelar_f <- na.omit(Base_de_ensayo)
# Se convierte la variable Num_hijos a factor
Base_modelar_f$Num_hijos <- as.factor(Base_modelar_f$Num_hijos)
set.seed(15234) # Semilla
# Se saca una muestra de entrenamiento que conserve las proporciones en la variable Num_hijos
trn_prop <- Base_modelar_f %>%
mutate(
var_indx = 1:dim(Base_modelar_f)[1]
) %>%
group_by(Num_hijos) %>%
sample_frac(0.8, replace = F)
# Se saca la muestra de test con las que no fueron seleccionadas en la muestra de train
tst_prop <- Base_modelar_f[-trn_prop$var_indx, ]
# Se elimina la variable de indice
trn_prop$var_indx <- NULL
Con la función ranger aplicamos el modelo de Bosques aleatorios
# Modelo RF
mod_RF <- ranger(
Num_hijos~.,
data = (trn_prop),
num.trees = 500,
mtry = 5,
max.depth = 8,
importance = 'impurity'
)
En la siguiente gráfica se muestra las variables que tienen mayor importancia para Bosques aleatorios:
Utilizamos los pesos de importancia asignados por el Bosque Aleatorio para escoger las variables que se utilizarán en el resto de modelos, además se tiene en cuenta la cantidad de NA en cada una de las variables.
colSums(is.na(Base_de_ensayo))
## Genero Edad Num_integrantes
## 0 0 0
## Num_cuartos Estrato Tipo_vivienda
## 0 5194 0
## Num_Subsidios Educacion_madre Estado_civil
## 0 2181 0
## Ultimo_pago_energia Ingresos_hogar Cant_hogares_vivienda
## 5194 0 0
## Num_hijos Uso_celular Vive_hogar_madre
## 0 9197 0
## Contrato_vivienda Etnia Afiliado
## 0 0 0
## Lugar_nacimiento Nivel_educativo
## 0 2366
Aunque Ingresos_hogar y Nivel_educativo en primera instancia tienen una importancia elevada para el modelo se decide eliminar Nivel_educativo ya que posee datos faltantes, adicionalmente se elimina Ingresoso_hogar ya que, a criterio de los investigadores, esta variable puede generar controversia a la hora de ser contestada.
library(tidyverse)
# Variables en orden de importancia según RF
var_imprt <- c(
"Num_integrantes",
"Estado_civil",
"Genero",
"Edad",
"Vive_hogar_madre",
"Num_hijos"
)
# Se convierte la variable Num_hijos a factor
Base_modelar_f <- Base_de_ensayo[,var_imprt]
Base_modelar_f$Num_hijos <- as.factor(Base_modelar_f$Num_hijos)
set.seed(15234) # Semilla
# Se saca una muestra de entrenamiento que conserve las proporciones en la variable Num_hijos
trn_prop <- Base_modelar_f %>%
mutate(
var_indx = 1:dim(Base_modelar_f)[1]
) %>%
group_by(Num_hijos) %>%
sample_frac(0.8, replace = F)
# Se saca la muestra de test con las que no fueron seleccionadas en la muestra de train
tst_prop <- Base_modelar_f[-trn_prop$var_indx, ]
# Se elimina la variable de indice
trn_prop$var_indx <- NULL
Se debe convertir la variable respuesta nuevamente a numérica para poder aplicar regresión lineal.
modelo1 <- lm(as.numeric(as.character(Num_hijos))~., data=trn_prop)
El error del modelo es 0.5346394
Análisis de residuales.
Se puede apreciar que no se cumplen los supuestos en los residuales.
Matriz de confusión
| -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 122 | 5948 | 646 | 127 | 32 | 7 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| 1 | 0 | 122 | 4143 | 409 | 83 | 7 | 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 321 | 3379 | 249 | 19 | 7 | 3 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 758 | 1056 | 50 | 8 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 1 | 578 | 143 | 26 | 4 | 0 | 2 | 0 | 0 | 0 | 0 | 0 |
| 5 | 0 | 0 | 0 | 0 | 4 | 215 | 200 | 67 | 25 | 21 | 4 | 0 | 1 | 2 | 1 |
La tasa de acierto es 0.1125592, la tasa de error es 0.8874408
Con la función rpart se ajusta el modelo y se analizan los resultados
mod1_arboles <- rpart(Num_hijos~., data = trn_prop)
Se hacen las predicciones y se obtiene la siguiente matriz de confusión
| 0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|
| 0 | 6188 | 410 | 176 | 91 | 13 | 6 |
| 1 | 333 | 3795 | 483 | 122 | 28 | 7 |
| 2 | 0 | 148 | 3287 | 444 | 73 | 27 |
| 3 | 0 | 0 | 60 | 1583 | 182 | 49 |
| 4 | 0 | 0 | 0 | 163 | 458 | 133 |
| 5 | 0 | 0 | 0 | 0 | 54 | 486 |
La tasa de acierto es 0.8403107, la tasa de error es 0.1596893
mod1_reg_arboles <- rpart(as.numeric(as.character(Num_hijos))~., data = trn_prop)
Se hacen las predicciones y se obtiene la matriz de confusión
| 0 | 1 | 2 | 3 | 4 | |
|---|---|---|---|---|---|
| 0 | 6407 | 285 | 140 | 33 | 19 |
| 1 | 1425 | 2756 | 483 | 69 | 35 |
| 2 | 0 | 317 | 3264 | 298 | 100 |
| 3 | 0 | 0 | 455 | 1188 | 231 |
| 4 | 0 | 0 | 0 | 163 | 591 |
| 5 | 0 | 0 | 0 | 0 | 540 |
La tasa de acierto es 0.7556785, la tasa de error es 0.2443215
HijosPoisson <-gamlss(as.numeric(as.character(Num_hijos))~., data= trn_prop, family=PO(mu.link="log"))
## GAMLSS-RS iteration 1: Global Deviance = 170257.6
## GAMLSS-RS iteration 2: Global Deviance = 170257.6
Se hacen las predicciones y obtenemos la matriz de confusión
| -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|---|---|
| 0 | 62 | 4464 | 2326 | 30 | 1 | 0 | 1 | 0 |
| 1 | 0 | 365 | 4272 | 126 | 5 | 0 | 0 | 0 |
| 2 | 0 | 27 | 3270 | 670 | 11 | 1 | 0 | 0 |
| 3 | 0 | 1 | 333 | 1525 | 13 | 2 | 0 | 0 |
| 4 | 0 | 0 | 19 | 696 | 36 | 3 | 0 | 0 |
| 5 | 0 | 0 | 0 | 221 | 268 | 43 | 4 | 4 |
acierto<-sum(diag(MC))/sum(MC)
error <- 1-acierto
La tasa de acierto es 0.2819831, la tasa de error es 0.7180169
mod_RF <- ranger(
Num_hijos~.,
data = (trn_prop),
num.trees = 500,
mtry = 5,
max.depth = 8,
importance = 'impurity'
)
Se hacen las predicciones y se obtiene la matriz de confusión
| 0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|
| 0 | 6254 | 207 | 9 | 0 | 0 | 0 |
| 1 | 426 | 3996 | 145 | 1 | 0 | 0 |
| 2 | 127 | 428 | 3336 | 77 | 1 | 1 |
| 3 | 58 | 90 | 385 | 1512 | 42 | 1 |
| 4 | 13 | 35 | 72 | 223 | 539 | 9 |
| 5 | 6 | 12 | 32 | 61 | 172 | 529 |
La tasa de acierto es 0.8599394, la tasa de error es 0.1400606
mod_Naive_Bayes <- naiveBayes(Num_hijos ~ ., data = trn_prop)
Se hacen las predicciones y se obtiene la matriz de confusión
| 0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|
| 0 | 5909 | 830 | 96 | 38 | 9 | 2 |
| 1 | 1342 | 3003 | 319 | 80 | 18 | 6 |
| 2 | 35 | 999 | 2547 | 332 | 52 | 14 |
| 3 | 0 | 29 | 426 | 1258 | 143 | 18 |
| 4 | 0 | 0 | 0 | 364 | 335 | 55 |
| 5 | 0 | 0 | 0 | 10 | 193 | 337 |
La tasa de acierto es 0.7122187, la tasa de error es 0.2877813
Conversion de las variables categoricas a variables dummy
library(dummies)
# Conjunto de entrenamiento
Base_KNN_dummy_trn <- dummy.data.frame(data=data.frame(trn_prop[ ,-6]))
Base_KNN_dummy_trn <- cbind(Base_KNN_dummy_trn,"Num_hijos" = trn_prop$Num_hijos)
# Conjunto de prueba
Base_KNN_dummy_tst <- dummy.data.frame(data=tst_prop[ ,-6])
Base_KNN_dummy_tst <- cbind(Base_KNN_dummy_tst,"Num_hijos" = tst_prop$Num_hijos)
Se normalizan las Variables Numéricas
#Conjunto de entrenamiento
datos_c_trn <- Base_KNN_dummy_trn
datos_c_trn[,c(1,10)] <- scale(datos_c_trn[,c(1,10)])
#Conjunto de prueba
datos_c_tst <- Base_KNN_dummy_tst
datos_c_tst[,c(1,10)] <- scale(datos_c_tst[,c(1,10)])
Conjuntos de entrenamiento y test
train <- datos_c_trn[ ,-14] # crea train sin la variable respuesta
test <- datos_c_tst[ ,-14] # crea test sin la variable respuesta
y_train <- datos_c_trn[ ,14]
y_test <- datos_c_tst[ ,14]
Se entrena el modelo knn para que escoja el número k óptimo siendo el valor máximo k=30.
modelo <- train.kknn(Num_hijos ~ ., data = datos_c_trn, kmax = 30)
modelo
pred_knn <- predict(modelo, datos_c_tst)
Con el k óptimo se realiza el modelo se hacen las predicciones y se obtiene la matriz de confusión
knn_model <- knn(train, test, cl = y_train, k = 18)
summary(knn_model)
## 0 1 2 3 4 5
## 6536 4579 3987 2097 890 710
| 0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|
| 0 | 6285 | 221 | 21 | 7 | 2 | 0 |
| 1 | 442 | 3984 | 152 | 1 | 0 | 0 |
| 2 | 107 | 434 | 3346 | 97 | 3 | 0 |
| 3 | 40 | 91 | 369 | 1517 | 78 | 2 |
| 4 | 7 | 30 | 68 | 207 | 535 | 43 |
| 5 | 3 | 8 | 23 | 45 | 136 | 495 |
La tasa de acierto es 0.8597266, la tasa de error es 0.1402734.
Para comparar la eficiencia de los modelos se crea una matriz en la cual se almacenará las tasas de acierto de los modelos que se construyeron en el paso anterior
df <- matrix(rep(NA,80), nrow=20, ncol=4)
df <- data.frame(df)
colnames(df) <- c("Arbol_clasificacion","RandomForest", "NaiveBayes", "Knn")
Para llenar la matriz anterior se realizó un for que ejecuta cada uno de los modelos 20 veces, escogiendo aleatoriamente el conjunto de entrenamiento y el conjunto de prueba
for(i in 1:20){
set.seed(i) # Semilla
# Se saca una muestra de entrenamiento que conserve las proporciones en la varaible Num_hijos
trn_prop <- Base_modelar_f %>%
mutate(
var_indx = 1:dim(Base_modelar_f)[1]
) %>%
group_by(Num_hijos) %>%
sample_frac(0.8, replace = F)
# Se saca la muestra de test con las que no fueron seleccionadas en la muestra de
# train
tst_prop <- Base_modelar_f[-trn_prop$var_indx, ]
# Se elimina la variable de índice
trn_prop$var_indx <- NULL
trn_prop <- trn_prop[sample(1:dim(trn_prop)[1]), ]
tst_prop <- tst_prop[sample(1:dim(tst_prop)[1]), ]
# Ajuste de los modelos
## Árbol de clasificación
arbol_clasificacion <- rpart(Num_hijos~., data = trn_prop)
pred_arbol_clasificacion <- predict(arbol_clasificacion, newdata = tst_prop, type=
"class")
tasa_arbol_clasificacion <- matriz_confusion(pred_arbol_clasificacion,
tst_prop$Num_hijos)
# Modelo RF
RF <- ranger(Num_hijos~., data = (trn_prop), num.trees = 100, mtry = 5,
max.depth = 8, importance = 'impurity')
pred_RF <- predict(RF, data = (tst_prop))
tasa_RF <- matriz_confusion(pred_RF$predictions, tst_prop$Num_hijos)
## Naive Bayes
Naive_Bayes <- naiveBayes(Num_hijos ~ ., data = trn_prop)
pred_Naive_Bayes <- predict(Naive_Bayes, newdata = tst_prop, type="class")
tasa_Naive_Bayes <- matriz_confusion(pred_Naive_Bayes, tst_prop$Num_hijos)
## Knn
# Conjunto de entrenamiento
Base_KNN_dummy_trn <- dummy.data.frame(data=data.frame(trn_prop[ ,-6]))
Base_KNN_dummy_trn <- cbind(Base_KNN_dummy_trn,"Num_hijos" = trn_prop$Num_hijos)
# Conjunto de prueba
Base_KNN_dummy_tst <- dummy.data.frame(data=tst_prop[ ,-6])
Base_KNN_dummy_tst <- cbind(Base_KNN_dummy_tst,"Num_hijos" = tst_prop$Num_hijos)
#Conjunto de entrenamiento
datos_c_trn <- Base_KNN_dummy_trn
datos_c_trn[,c(1,10)] <- scale(datos_c_trn[,c(1,10)])
#Conjunto de prueba
datos_c_tst <- Base_KNN_dummy_tst
datos_c_tst[,c(1,10)] <- scale(datos_c_tst[,c(1,10)])
# Separación de la variable respuesta
train <- datos_c_trn[ ,-14] # crea train sin la variable respuesta
test <- datos_c_tst[ ,-14] # crea test sin la variable respuesta
y_train <- datos_c_trn[ ,14]
y_test <- datos_c_tst[ ,14]
pred_knn <- knn(train, test, cl = y_train, k = 20)
tasa_knn <- matriz_confusion(pred_knn, y_test)
print(paste("Tasa acierto Knn:", tasa_knn))
tasas <- c(tasa_arbol_clasificacion, tasa_RF, tasa_Naive_Bayes, tasa_knn)
df[i,] <- tasas
}
| Arbol_clasificacion | RandomForest | NaiveBayes | Knn | |
|---|---|---|---|---|
| 1 | 0.84280 | 0.86150 | 0.715600 | 0.861000 |
| 2 | 0.84260 | 0.86240 | 0.717300 | 0.860900 |
| 3 | 0.83990 | 0.85970 | 0.719800 | 0.856900 |
| 4 | 0.83690 | 0.85800 | 0.708100 | 0.858200 |
| 5 | 0.84250 | 0.86500 | 0.713500 | 0.864400 |
| 6 | 0.84180 | 0.86360 | 0.721000 | 0.860600 |
| 7 | 0.84110 | 0.86040 | 0.717700 | 0.858600 |
| 8 | 0.84170 | 0.86240 | 0.709900 | 0.858700 |
| 9 | 0.84210 | 0.86350 | 0.713700 | 0.861900 |
| 10 | 0.83940 | 0.86310 | 0.715300 | 0.861100 |
| 11 | 0.84730 | 0.86760 | 0.717200 | 0.863900 |
| 12 | 0.84220 | 0.86220 | 0.722300 | 0.860700 |
| 13 | 0.84320 | 0.86410 | 0.721600 | 0.862600 |
| 14 | 0.84350 | 0.86670 | 0.709800 | 0.867500 |
| 15 | 0.83990 | 0.86030 | 0.713800 | 0.857200 |
| 16 | 0.83970 | 0.86330 | 0.708600 | 0.860800 |
| 17 | 0.83980 | 0.86160 | 0.712200 | 0.858500 |
| 18 | 0.84220 | 0.86060 | 0.715300 | 0.859200 |
| 19 | 0.84140 | 0.86140 | 0.710000 | 0.860500 |
| 20 | 0.84160 | 0.86040 | 0.708800 | 0.860700 |
| Media | 0.84158 | 0.86239 | 0.714575 | 0.860695 |
El modelo final se escogió ya que no solo presenta una de las tasas de acierto más altas entre todos los modelos desarrollados, sino que a su vez nos permitió reducir la dimensionalidad del conjunto de datos, ya que este valoraba y utilizaba 5 variables principalmente para la modelación y predicción, además de que estas variables no contaban con valores faltantes permitiéndonos contar con el conjunto de datos completo que es una cantidad muy apreciable de registros.
Como último filtro, se busca reducir el número de árboles que se utilizó en el proceso anterior. Para esto se hace una prueba cambiando el tamaño del bosque a 100 árboles en lugar de 500
RF <- ranger(Num_hijos~., data = (trn_prop), num.trees = 100, mtry = 5,
max.depth = 8, importance = 'impurity')
pred_RF <- predict(RF, data = (tst_prop))
tasa_RF <- matriz_confusion(pred_RF$predictions, tst_prop$Num_hijos)
La tasa de acierto tanto con 100 y 500 árboles es de aproximadamente 0.86, es decir, el tamaño del bosque no representa un cambio significativo a la hora de predecir, por lo que se decide implementar el modelo con 100 árboles.
RandomForest <- ranger(Num_hijos~., data = Base_modelo, num.trees = 100, mtry = 5,
max.depth = 8, importance = 'impurity')
A continuación se darán los datos que corresponden a la información de cada uno de los investigadores
require(ranger)
Miguel <- c(3, 6, 1, 52, 2)
Jennifer <- c(4, 2, 2, 43, 3)
Juan <- c(4, 6, 1, 59, 2)
Cristina <- c(3, 2, 2, 50, 2)
Salome <- c(3, 4, 2, 53, 3)
df <- rbind(Miguel, Jennifer, Juan, Cristina, Salome)
df <- data.frame(df)
colnames(df) <- c("Num_integrantes",
"Estado_civil",
"Genero",
"Edad",
"Vive_hogar_madre")
real <- factor(c(1,2,2,1,2),levels = c("0","1","2","3","4","5"))
prediccion <- predict(RandomForest, df)
prediccion$predictions
## [1] 1 2 2 1 2
## Levels: 0 1 2 3 4 5
| Inverstigador | Valores_predichos | Valores_Reales |
|---|---|---|
| Miguel | 1 | 1 |
| Jennifer | 2 | 2 |
| Juan | 2 | 2 |
| Cristina | 1 | 1 |
| Salome | 2 | 2 |
Bonilla Jaime, G., & Garcia Valdez, E. (2009). Impacto de las condiciones socioeconomicas familiares en las decisiones de fertilidad (numero de hijos), utilizando un modelo de regresión poisson: período de estudio 2005-2006 (Bachelor’s thesis).
Forero, Nohora, & Gamboa, Luis Fernando. (2009). Family Size in Colombia: Guessing or Planning? Intended vs. Actual Family Size in Colombia. Desarrollo y Sociedad, (64), 85-118. Retrieved March 31, 2021, Recuperada de http://www.scielo.org.co/scielo.php?script=sci_arttext&pid=S0120-35842009000200004&lng=en&tlng=en.
García, D. & Jaramillo, A. (6 de Enero de 2019). El cambio social que se gesta en los hogares colombianos. El Tiempo. https://www.eltiempo.com/economia/sectores/que-implica-que-los-hogares-colombianos-sean-mas-pequenos-analisis-censo-2018-311776
Robayo, E. P. (2019). Tipología del hogar en Colombia (2000-2015): Características Sociodemográficas de las mujeres. (Tesis de Maestría, Universidad Externado de Colombia). Recuperada de https://bdigital.uexternado.edu.co/bitstream/001/2223/1/DKA-spa-2019-Tipologias_de_hogar_en_Colombia_2000_2015_caracteristicas_sociodemograficas_de_las_mujeres
Wright, M. N. & Ziegler, A. (2017). ranger: A fast implementation of random forests for high dimensional data in C++ and R. J Stat Softw 77:1-17. https://doi.org/10.18637/jss.v077.i01.